﻿/************************************************************
FileName: editview.h
Author: XYH
Version : 1.0
Date: 2024-10-24
Description: 编辑视图类，继承自QgsMapTool，用于实现地图编辑工具
Function List:
1. setLayer - 设置当前编辑图层和编辑模式
2. reset - 重置编辑状态
3. canvasReleaseEvent - 捕获鼠标释放事件，用于记录点坐标
4. canvasMoveEvent - 捕获鼠标移动事件，用于更新橡皮筋位置
5. canvasDoubleClickEvent - 捕获鼠标双击事件，用于结束线段绘制
6. createPoint - 创建点要素
7. addPointToLine - 添加点到线段列表
8. updateRubberBand - 更新橡皮筋的动态效果
9. finishLine - 完成线要素的创建
10. addPointToPolygon - 添加点到面顶点列表
11. finishPolygon - 完成面要素的创建
12. initializeAttributes - 初始化要素的属性字段
*************************************************************/

#ifndef EDITVIEW_H
#define EDITVIEW_H

#include <QgsMapTool.h>
#include <QgsVectorLayer.h>
#include <QgsFeature.h>
#include <QgsGeometry.h>
#include <QgsPointXY.h>
#include <QgsMapCanvas.h>
#include <QMouseEvent>
#include <QList>
#include <QgsMapMouseEvent.h>
#include <QMessageBox>
#include <QgsRubberBand.h>
#include <QgsFillSymbol.h>

class EditView : public QgsMapTool {
	Q_OBJECT

public:
	enum EditMode {
		None,
		PointMode,
		LineMode,
		PolygonMode
	};

	EditView(QgsMapCanvas* canvas, QObject* parent = nullptr);

	// 设置当前编辑图层
	void setLayer(QgsVectorLayer* layer, EditMode mode);

	// 重置编辑状态
	void reset();

protected:
	// 捕获鼠标点击事件，用于记录点坐标
	void canvasReleaseEvent(QgsMapMouseEvent* event) override;

	// 捕获鼠标移动事件，用于更新橡皮筋位置
	void canvasMoveEvent(QgsMapMouseEvent* event) override;

	// 捕获鼠标双击事件，用于结束线段绘制
	void canvasDoubleClickEvent(QgsMapMouseEvent* event) override;

private:
	QgsMapCanvas* mpCanvas;
	QgsVectorLayer* mCurrentLayer;
	EditMode mEditMode;
	QList<QgsPointXY> points;  // 用于存储线段的点列表
	QgsRubberBand* mpRubberBand;

	// 创建点要素
	void createPoint(const QgsPointXY& point);

	// 添加点到线段列表
	void addPointToLine(const QgsPointXY& point);

	// 更新橡皮筋的动态效果
	void updateRubberBand(const QgsPointXY& tempPoint);

	// 完成线要素的创建
	void finishLine();

	// 添加点到面顶点列表
	void addPointToPolygon(const QgsPointXY& point);

	// 完成面要素的创建
	void finishPolygon();

	// 初始化要素的属性字段
	void initializeAttributes(QgsFeature& feature);
};

#endif